package org.glut.wechat.chat.controller;
import org.glut.wechat.chat.domain.User;
import org.glut.wechat.chat.service.IUserService;
import org.glut.wechat.chat.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

@RestController
// 添加跨域注解，允许来自前端的请求
@CrossOrigin(origins = {"http://localhost:5173", "http://localhost:5174"}, allowCredentials = "true")
@RequestMapping("user")
public class UserController {

    @Autowired
    private IUserService iuserService;

    // 注入Redis工具类
    @Autowired
    private RedisUtil redisUtil;

    // Redis聊天记录键前缀（与ChatEndpoint保持一致）
    private static final String CHAT_REDIS_KEY_PREFIX = "chat:history:";
    // 新增群聊Redis键前缀（与单聊区分，避免冲突）
    private static final String GROUP_CHAT_REDIS_KEY_PREFIX = "chat:group:history:";

    /**
     * 根据用户id获取用户名
     */
    @GetMapping("/GetUserName/{id}")
    public String getUsernameById(@PathVariable Integer id) {
        User user = iuserService.selectById(id);
        if (user == null) {
            // 可以根据需求返回null、抛出异常或返回默认值
            return null;
        }
        return user.getUsername();
    }

    /**
     * 根据用户id查询全部
     */
    @GetMapping("/selectAllById/{id}")
    public User selectAllById(@PathVariable Integer id) {
        User user = iuserService.selectById(id);
        return user;
    }

    /**
     * 查询聊天历史记录接口
     * 供前端加载Redis中存储的历史消息
     */
    @GetMapping("/chat/history")
    public List<Object> getChatHistory(
            @RequestParam("userId") String userId,    // 当前用户ID
            @RequestParam("friendId") String friendId // 好友ID
    ) {
        // 生成与存储时一致的Redis key（小ID:大ID）
        int user = Integer.parseInt(userId);
        int friend = Integer.parseInt(friendId);
        String smallId = user < friend ? userId : friendId;
        String bigId = user > friend ? userId : friendId;
        String redisKey = CHAT_REDIS_KEY_PREFIX + smallId + ":" + bigId;

        // 从Redis获取历史消息（0到-1表示获取全部）
        return redisUtil.lGet(redisKey, 0, -1);
    }

    /**
     * 新增：获取当前用户有历史聊天记录的所有好友ID（从Redis查询）
     */

    @GetMapping("/chat/history/list")
    public Set<String> getHistoryChatFriendIds(@RequestParam("userId") String userId) {
        Set<String> friendIds = Collections.newSetFromMap(new ConcurrentHashMap<>());
        try {
            // 严格匹配 "chat:history:userId:*" 或 "chat:history:*:userId"
            String pattern1 = CHAT_REDIS_KEY_PREFIX + userId + ":*"; // userId在前（小ID）
            String pattern2 = CHAT_REDIS_KEY_PREFIX + "*:" + userId; // userId在后（大ID）

            // 获取两种模式的所有匹配键
            Set<String> matchedKeys1 = redisUtil.keys(pattern1);
            Set<String> matchedKeys2 = redisUtil.keys(pattern2);

            // 合并键集合
            Set<String> allMatchedKeys = new HashSet<>();
            if (matchedKeys1 != null) allMatchedKeys.addAll(matchedKeys1);
            if (matchedKeys2 != null) allMatchedKeys.addAll(matchedKeys2);

            // 解析好友ID
            for (String key : allMatchedKeys) {
                String keyWithoutPrefix = key.replace(CHAT_REDIS_KEY_PREFIX, "");
                String[] idParts = keyWithoutPrefix.split(":");
                // 确保分割后有两个ID（避免格式错误的键）
                if (idParts.length == 2) {
                    String friendId = idParts[0].equals(userId) ? idParts[1] : idParts[0];
                    friendIds.add(friendId);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("获取历史会话好友ID失败：" + e.getMessage());
        }
        return friendIds;
    }

    // 4. 群聊历史记录接口（复用/user/chat/history路径，加groupId参数区分）
    @GetMapping("/chat/group/history")
    public List<Object> getGroupChatHistory(@RequestParam("groupId") String groupId) {
        String redisKey = GROUP_CHAT_REDIS_KEY_PREFIX + groupId;
        return redisUtil.lGet(redisKey, 0, -1); // 获取群聊所有历史记录
    }

}
